/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package iluscodelogica;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 *
 * @author IlusCode Software para aprender a programar
 * 
 * CLASE UTILIZADA PARA GUARDAR LAS INSTRUCCIONES EN UN UNA LISTA
 * 
 * 
 */
public class Algoritmo implements Serializable{

    private static final long serialVersionUID = 1L;
    List instrucciones;
    int dirInicio;

    /**
     *
     */
    public Algoritmo() {

        instrucciones = new ArrayList<>();
        dirInicio = 0;

    }

    /**
     *
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {

        if (obj instanceof Algoritmo) {
            Algoritmo algori = (Algoritmo) obj;

            return (this.dirInicio == algori.dirInicio && this.instrucciones.equals(algori.instrucciones));
        }
        return false;
    }

    /**
     *
     * @return
     */
    @Override
    public int hashCode() {
        int hash = 7;
        hash = 11 * hash + Objects.hashCode(this.instrucciones);
        hash = 11 * hash + this.dirInicio;
        return hash;
    }

    /**
     *
     */
    public void insertar() {

        instrucciones.add(null);
    }

    /**
     *
     * @param i
     * 
     * Metodo para insertar una instrucción
     */
 
    public void insertar(Instruccion i) {

        instrucciones.add(i);
    }

    /**
     *
     * @param ubica
     * @param i
     * 
     * Metodo para insertar un instrucción pasada como parametro
     */
  
    public void insertar(int ubica, Instruccion i) {

        instrucciones.set(ubica, i);
    }

    /**
     *
     * @param salto
     * 
     * Metodo para insertar un salto en el la ejecución del codigo
     */
  
    public void insertar(int salto) {

        Integer sal = new Integer(salto);
        instrucciones.add(sal);

    }

    /**
     *
     * @param ubica
     * @param salto
     * 
     * Metodo para insertar un salto en una ubicación de la lista
     */
 
    public void insertar(int ubica, int salto) {

        Integer sal = new Integer(salto);
        instrucciones.set(ubica, sal);
    }

    /**
     *
     * @param dirIni
     * 
     * Metodo para setear la dirección de inicio
     */

    public void setDirInicio(int dirIni) {
        dirInicio = dirIni;
    }

    /**
     *
     * @return
     * 
     * Metodo que devuelve la dirección de inicio 
     */
   
    public int getDirInicio() {
        return dirInicio;
    }

    /**
     *
     * @return
     * 
     * Metodo que devuelve el tamanio de la lista
     */
 
    public int getTamanio() {
        return instrucciones.size();
    }

    /**
     *
     * @param ubica
     * @return
     * 
     * 
     * Metodo que devuelve un elemento de la lista
     */
  
    public Object getElemento(int ubica) {

        return instrucciones.get(ubica);
    }

    /**
     * 
     * Metodo que devuelve una instrucción de una ubicación
     *
     * @param ubica
     * @return
     */
   
    public Instruccion getInstruccion(int ubica) {
        return (Instruccion) getElemento(ubica);
    }

   
    /**
     * 
     * Metodo que devuelve la lista de instrucciones
     *
     * @return
     */
 
    public List getInstrucciones() {
        return instrucciones;
    }
}
